﻿using System.Collections;
using System.Collections.Concurrent;

namespace System.NETool
{
    /// <summary>
    /// 并行哈希集合
    /// </summary>
    /// <remarks>
    /// 主要用于频繁添加删除而又要遍历的场合
    /// </remarks>
    public class ConcurrentHashSet<T> : IEnumerable<T> where T : notnull
    {
        private readonly ConcurrentDictionary<T, byte> _dic = new();

        /// <summary>
        /// 是否空集合
        /// </summary>
        public bool IsEmpty => _dic.IsEmpty;

        /// <summary>
        /// 元素个数
        /// </summary>
        public int Count => _dic.Count;

        /// <summary>
        /// 是否包含元素
        /// </summary>
        /// <param name="item">要检查的元素</param>
        /// <returns>如果包含该元素则返回 true，否则返回 false</returns>
        public bool Contains(T item) => _dic.ContainsKey(item);

        /// <summary>
        /// 尝试添加元素
        /// </summary>
        /// <param name="item">要添加的元素</param>
        /// <returns>如果成功添加则返回 true，否则返回 false</returns>
        public bool TryAdd(T item) => _dic.TryAdd(item, 0);

        /// <summary>
        /// 尝试删除元素
        /// </summary>
        /// <param name="item">要删除的元素</param>
        /// <returns>如果成功删除则返回 true，否则返回 false</returns>
        public bool TryRemove(T item) => _dic.TryRemove(item, out _);

        #region IEnumerable<T> 成员
        /// <summary>
        /// 获取枚举器
        /// </summary>
        /// <returns>返回一个用于遍历集合的枚举器</returns>
        IEnumerator<T> IEnumerable<T>.GetEnumerator() => _dic.Keys.GetEnumerator();
        #endregion

        #region IEnumerable 成员
        /// <summary>
        /// 获取枚举器
        /// </summary>
        /// <returns>返回一个用于遍历集合的枚举器</returns>
        IEnumerator IEnumerable.GetEnumerator() => _dic.Keys.GetEnumerator();
        #endregion
    }
}
